import {Queue} from "./QtUtils";


/**
 * 样例
 */
// let chainTask = new ChainTask();
// chainTask.addTask((data) => {
//   console.log('1','first',data);
//   chainTask.toNext('task-1');
// }).addTask((data) => {
//   nextText(data);
// }).addTask((data) => {
//   if(data == 0) {
//     console.log('3','third-success',data);
//   }else {
//     console.log('3','third-fail',data);
//   }
//   chainTask.toNext('task-3');
// }).execute((data)=>{
//   console.log('complete',data);
// })
//
// function nextText(data) {
//   console.log('2','second',data);
//   setTimeout(function () {
//     chainTask.toNext(1);
//   },6000)
// }


export default class ChainTask {
  constructor() {
    this.fnTaskList = new Queue();
    this.fnComplete = null;
  }

  /**
   * 执行任务
   * @param fnTask (any:data)=>{}
   * nextWrap 下一步，stopWrap 直接结束
   */
  addTask(fnTask) {
    this.fnTaskList.push(fnTask);
    return this;
  }

  /**
   *
   * @param fnComplete (any:data)=>{}
   */
  execute(fnComplete,data = null) {
    if(!this.fnComplete) {
      this.fnComplete = fnComplete;
    }
    if(this.fnTaskList.size() > 0) {
      let fnCurTask = this.fnTaskList.pop();
      if(fnCurTask) {
        fnCurTask(data,this._fnNextWrap.bind(this),this._fnStopWrap.bind(this));
      }
    }else {
      if(this.fnComplete) {
        this.fnComplete(data);
      }
    }
  }

  /**
   * 下一步
   * @param nextData
   */
  toNext(nextData) {
    this._fnNextWrap(nextData);
  }

  /**
   * 结束
   * @param stopData
   */
  toStop(stopData) {
    this._fnStopWrap(this.fnComplete,stopData);
  }

  /**
   * 下一步
   * @param nextData
   * @private
   */
  _fnNextWrap(nextData) {
    this.execute(this.fnComplete,nextData);
  }

  /**
   * 结束
   * @param stopData
   * @private
   */
  _fnStopWrap(stopData) {
    this.fnTaskList.clear();
    this.execute(this.fnComplete,stopData);
  }
}
